package cn.mini.mybatis.mybatis.mapping;


import javax.sql.DataSource;

/**
 * Environment 类用于封装数据库环境相关的配置信息，
 * 包含环境 ID 和数据源信息，使用建造者模式进行对象的创建。
 */
public class Environment {

    /**
     * 环境的唯一标识符，使用 final 修饰确保其不可变。
     */
    // 环境id
    private final String id;
    /**
     * 数据库连接的数据源，使用 final 修饰确保其不可变。
     */
    // 数据源
    private final DataSource dataSource;

    /**
     * 构造函数，用于创建 Environment 对象。
     *
     * @param id 环境的唯一标识符
     * @param dataSource 数据库连接的数据源
     */
    public Environment(String id,DataSource dataSource) {
        this.id = id;
        this.dataSource = dataSource;
    }

    /**
     * Builder 静态内部类，用于使用建造者模式构建 Environment 对象。
     */
    public static class Builder {

        /**
         * 环境的唯一标识符，在构建过程中临时存储。
         */
        private String id;
        /**
         * 数据库连接的数据源，在构建过程中临时存储。
         */
        private DataSource dataSource;

        /**
         * 构造函数，初始化 Builder 对象的环境 ID。
         *
         * @param id 环境的唯一标识符
         */
        public Builder(String id) {
            this.id = id;
        }

        /**
         * 设置数据源信息，并返回当前 Builder 对象，支持链式调用。
         *
         * @param dataSource 数据库连接的数据源
         * @return 当前 Builder 对象
         */
        public Builder dataSource(DataSource dataSource) {
            this.dataSource = dataSource;
            return this;
        }

        /**
         * 获取当前 Builder 对象中存储的环境 ID。
         *
         * @return 环境的唯一标识符
         */
        public String id() {
            return this.id;
        }

        /**
         * 构建并返回一个 Environment 对象。
         * 注意：当前代码存在问题，this.transactionFactory 无法解析，应修正为只传入 id 和 dataSource。
         *
         * @return 构建好的 Environment 对象
         */
        public Environment build() {
            // 此处存在问题，transactionFactory 未定义，正确写法应为 new Environment(this.id, this.dataSource);
            return new Environment(this.id, this.dataSource);
        }

    }

    /**
     * 获取 Environment 对象的环境 ID。
     *
     * @return 环境的唯一标识符
     */
    public String getId() {
        return id;
    }

    /**
     * 获取 Environment 对象的数据源。
     *
     * @return 数据库连接的数据源
     */
    public DataSource getDataSource() {
        return dataSource;
    }
}